package com.wasin.server.util;

import com.diboot.core.entity.BaseEntity;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @ 作者： wasin
 * @ 创建时间： 2021/9/18  11:58
 * @ 说明：    对list的操作
 * @ 当前版本:  1.0.0
 */
public class ListUtils {

   // 交集	listA.retainAll(listB)	listA内容变为listA和listB都存在的对象	listB不变
    //差集	listA.removeAll(listB)	listA中存在的listB的内容去重	listB不变
    //并集	listA.removeAll(listB) listA.addAll(listB)	为了去重，listA先取差集，然后追加全部的listB	listB不变

    /**
     * 获取两个对象集合中id重复的数据 获取交集
     * @param list1
     * @param list2
     * @return
     */
    public static  List<BaseEntity> getCrossEntity(List<BaseEntity> list1, List<BaseEntity> list2){
        List<BaseEntity> rsList=new ArrayList<>();
        for (BaseEntity baseEntity:list1){
            for (BaseEntity baseEntity1:list2){
                if(baseEntity.getId().equals(baseEntity1.getId())){
                    rsList.add(baseEntity);
                    break;
                }
            }
        }
        return rsList;
    }

    /**
     * 根据id 获取list1去除了list2中的数据
     * @param list1
     * @param list2
     * @return
     */
    public static List<BaseEntity> getDiffList(List<BaseEntity> list1, List<BaseEntity> list2){
        for (int i = 0; i < list1.size(); i++) {
            for (int j = 0; j < list2.size(); j++) {
                if(list1.get(i).getId().equals(list2.get(j).getId())){
                    list1.remove(list1.get(i));
                    i--;
                    break;
                }
            }
        }
        return list1;

    }

    /**
     * 根据id获取两个对象集合的并集 list1 会发生改变
     * @param list1
     * @param list2
     * @return
     */
    public static List<BaseEntity> getMergeList(List<BaseEntity> list1, List<BaseEntity> list2){
        List<BaseEntity> diffList = getDiffList(list1, list2);
        diffList.addAll(list2);
        return diffList;
    }


    /**
     * 获取当前列表中对象的id集合 会去重
     * @param list
     * @return
     */
    public static List<Long> getEntityIds(List<BaseEntity> list){
        return list.stream().map(BaseEntity::getId).distinct().collect(Collectors.toList());
    }

    /**
     * 按id对当前集合进行排序不去重
     * @param list
     * @return
     */
    public static List<BaseEntity> sortEntityList(List<BaseEntity> list){
        return list.stream().sorted(Comparator.comparing(BaseEntity::getId)).collect(Collectors.toList());
    }
}
